package cn.edu.sgu.www.pms.util;

import cn.edu.sgu.www.pms.exception.GlobalException;
import cn.edu.sgu.www.pms.restful.ResponseCode;
import lombok.extern.slf4j.Slf4j;

/**
 * Object工具类，由java.util.Objects演变而来
 * @author 沐雨橙风ιε
 * @version 1.0
 */
@Slf4j
public class ObjectUtils {

    /**
     * 数据校验：如果对象为null，抛出异常，否则返回原目标对象
     * @param obj 目标对象
     * @param message 异常信息
     * @param <T> 方法返回类型
     * @return T 目标对象
     * @apiNote 对于字符串类型的数据，该方法等同于cn.edu.sgu.www.mhxysy.util.ObjectUtils#requireNonBlank(java.lang.String, java.lang.String)
     */
    @SuppressWarnings("all")
    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null) {
            throw new GlobalException(ResponseCode.BAD_REQUEST, message);
        }

        // 字符串调用requireNonBlank()方法
        if (obj instanceof String) {
            return (T) requireNonBlank(obj.toString(), message);
        }

        return obj;
    }

    /**
     * 数据校验：如果对象为null、空字符串或空白字符，抛出异常，否则返回原目标对象
     * @param obj 目标对象
     * @param message 异常信息
     * @return String
     */
    public static String requireNonBlank(String obj, String message) {
        if (obj == null || StringUtils.isEmpty(obj)) {
            throw new GlobalException(ResponseCode.BAD_REQUEST, message);
        }

        return obj;
    }

    /**
     * 数据校验：如果对象为null、取值不在[min, max]区间，抛出异常；否则返回原目标对象
     * @param obj 目标对象
     * @param min 最小值
     * @param max 最大值
     * @return String
     */
    public static Integer requireRange(Integer obj, Integer min, Integer max, String message) {
        if (min != null && max != null) {
            if (obj >= min && obj <= max) {
                return obj;
            }

            throw new GlobalException(ResponseCode.BAD_REQUEST, message);
        } else if (min != null) {
            return requireMin(obj, min, message);
        } else if (max != null) {
            return requireMax(obj, max, message);
        } else {
            String errorMessage = "参数min和max不能全部为null";

            log.debug(errorMessage);

            throw new GlobalException(ResponseCode.BAD_REQUEST, errorMessage);
        }
    }

    /**
     * 数据校验：如果对象为null、小于min，抛出异常；否则返回原目标对象
     * @param obj 目标对象
     * @param min 最小值
     * @return String
     */
    public static Integer requireMin(Integer obj, Integer min, String message) {
        if (obj < min) {
            throw new GlobalException(ResponseCode.BAD_REQUEST, message);
        }

        return obj;
    }

    /**
     * 数据校验：如果对象为null、大于max，抛出异常；否则返回原目标对象
     * @param obj 目标对象
     * @param max 最大值
     * @return String
     */
    public static Integer requireMax(Integer obj, Integer max, String message) {
        if (obj > max) {
            throw new GlobalException(ResponseCode.BAD_REQUEST, message);
        }

        return obj;
    }

}